package com.zhang.spark_1.spark_core.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @title:
 * @author: zhang
 * @date: 2021/12/5 18:51 
 */
object Spark17_RDD_Operator_Transform {

  def main(args: Array[String]): Unit = {
    //获取spark的连接
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("operator")
    val sc: SparkContext = new SparkContext(conf)
    //TODO aggregateByKey
    val rdd: RDD[(String, Int)] = sc.makeRDD(List(
      ("a", 1), ("a", 2), ("a", 3), ("a", 4)
    ),2)
    //aggregateByKey 存在函数柯里化，有两个参数
    //第一个参数列表，需要传递一个参数，表示为初始值
    //    主要用于当碰见第一个key的时候，和value进行分区计算
    //第二参数列表需要传递2个参数
    //   第一个参数表示分区内计算规则，第二参数表示分区间计算规则

    val aggregateByKey: RDD[(String, Int)] = rdd.aggregateByKey(0)(
      (x, y) => math.max(x, y),
      (x, y) => x + y
    )
    aggregateByKey.collect().foreach(println)
    //当分区内和分区间计算逻辑相同时可以使用foldByKey
    rdd.foldByKey(0)(_+_).collect().foreach(println)



    sc.stop()

  }
}
